/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package correctoraprojectdaewar;

import com.sun.rave.web.ui.appbase.AbstractApplicationBean;
import com.sun.webui.jsf.model.Option;
import entity.Admins;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.FacesException;
import local.AdminsFacadeLocal;
import local.BancosRegistadosFacadeLocal;
import mb.Multibanco;

/**
 * <p>Application scope data bean for your application.  Create properties
 *  here to represent cached data that should be made available to all users
 *  and pages in the application.</p>
 *
 * <p>An instance of this class will be created for you automatically,
 * the first time your application evaluates a value binding expression
 * or method binding expression that references a managed bean using
 * this class.</p>
 *
 * @version ApplicationBean1.java
 * @version Created on 12/Jan/2010, 17:59:10
 * @author Emanuel
 */
public class ApplicationBean1 extends AbstractApplicationBean {

    private Multibanco mb = new Multibanco();
    private String emailCliente;
    private String nibCliente;
    @EJB
    private AdminsFacadeLocal adminsFacade;
    @EJB
    private BancosRegistadosFacadeLocal bancosLocal;
    private String entidade;
    private String referencia;
    private String nibDestino;
    private String montante;
    private String login = null;
    private String password = null;
    /**
     * Auxiliares para quando forem feitas as operações,
     * caso o utilizador queira comprovativo , seja enviado
     * um email com a mensagem
     */
    private String mensagemTransferencia = null;
    private String mensagemPagamentoServiço = null;
    private String mensagemSaldos = null;
    private String mensagemMovimentosConta = null;
    private String IPin;
    private Integer pin;
    private Integer codCartaoCliente;
    // <editor-fold defaultstate="collapsed" desc="Managed Component Definition">

    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private void _init() throws Exception {
    }
    // </editor-fold>

    /**
     * <p>Construct a new application data bean instance.</p>
     */
    public ApplicationBean1() {
    }

    /**
     * <p>This method is called when this bean is initially added to
     * application scope.  Typically, this occurs as a result of evaluating
     * a value binding or method binding expression, which utilizes the
     * managed bean facility to instantiate this bean and store it into
     * application scope.</p>
     * 
     * <p>You may customize this method to initialize and cache application wide
     * data values (such as the lists of valid options for dropdown list
     * components), or to allocate resources that are required for the
     * lifetime of the application.</p>
     */
    @Override
    public void init() {
        // Perform initializations inherited from our superclass
        super.init();
        // Perform application initialization that must complete
        // *before* managed components are initialized
        // TODO - add your own initialiation code here

        // <editor-fold defaultstate="collapsed" desc="Managed Component Initialization">
        // Initialize automatically managed components
        // *Note* - this logic should NOT be modified
        try {
            _init();
        } catch (Exception e) {
            log("ApplicationBean1 Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e : new FacesException(e);
        }

        // </editor-fold>
        // Perform application initialization that must complete
        // *after* managed components are initialized
        // TODO - add your own initialization code here
    }

    /**
     * <p>This method is called when this bean is removed from
     * application scope.  Typically, this occurs as a result of
     * the application being shut down by its owning container.</p>
     * 
     * <p>You may customize this method to clean up resources allocated
     * during the execution of the <code>init()</code> method, or
     * at any later time during the lifetime of the application.</p>
     */
    @Override
    public void destroy() {
    }

    /**
     * <p>Return an appropriate character encoding based on the
     * <code>Locale</code> defined for the current JavaServer Faces
     * view.  If no more suitable encoding can be found, return
     * "UTF-8" as a general purpose default.</p>
     *
     * <p>The default implementation uses the implementation from
     * our superclass, <code>AbstractApplicationBean</code>.</p>
     */
    @Override
    public String getLocaleCharacterEncoding() {
        return super.getLocaleCharacterEncoding();
    }

    /**
     * This returns an array of discount options that can be used to bind to a
     * dropdown list, e.g. the discount code dropdown list in CustomerDetails
     * @return Option[] discountCodes
     */
    public com.sun.webui.jsf.model.Option[] getDiscountCodes() {
        com.sun.webui.jsf.model.Option[] suspensoOption = null;
        List<String> suspensoOpt = new LinkedList<String>();
        suspensoOpt.add("sim");
        suspensoOpt.add("nao");

        int i = 0;
        suspensoOption = new com.sun.webui.jsf.model.Option[suspensoOpt.size()];

        for (String dc : suspensoOpt) {
            suspensoOption[i++] = new Option(dc);
        }

        return suspensoOption;
    }

    /**
     * Verifica o login
     */
    public String verificaLogin() {
        List<Admins> listaAdmins = this.getAdminsFacade().findAll();

        for (Admins admins : listaAdmins) {
            if (admins.getPass().matches(password) && admins.getLogin().matches(login)) {
                return "Login";
            }
        }
        return "";
    }

    public boolean efectuarTransferencia() {
        try {
            this.mb.efectuarTransferenciaMultibanco(this.nibCliente, this.nibDestino, this.montante);
            this.setMensagemTransferencia("Foi transferido o montante " + this.montante + " para a conta " + this.nibDestino);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public void consultarMovimentos() {
        List<String> movimentos = this.mb.getMoveimentosDeConta(codCartaoCliente);
        for (String string : movimentos) {
            this.mensagemMovimentosConta += string + "\n";
        }
    }

    public void constroiMensagemPagamentosServicos() {
        this.mensagemPagamentoServiço = "Pagamento serviço:\n" +
                "Entidade: " + entidade +
                "\nReferencia: " + referencia +
                "\nMontante: " + montante;
        //efectuar a chamada do metodo para a entidade banca a informar do movimento efectuado
        //pagamentoServico(Integer codCartao, long montante, Integer entidade, long referencia, String nib)
        this.mb.pagamentoServico(codCartaoCliente, Long.getLong(montante), Integer.getInteger(entidade), Long.getLong(referencia), getNibCliente());
    }

    void constroiMensagemTransferenciabancaria() {
        this.mensagemTransferencia = "Transferencia Bancaria:\n" +
                "Nib destino: " + getNibDestino() +
                "\nMontante: " + getMontante();
    }

    // <editor-fold defaultstate="collapsed" desc="Gets & sets">
    /**
     * @return the login
     */
    public String getLogin() {
        return login;
    }

    /**
     * @param login the login to set
     */
    public void setLogin(String login) {
        this.login = login;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * @return the mb
     */
    public Multibanco getMb() {
        return mb;
    }

    /**
     * @return the emailCliente
     */
    public String getEmailCliente() {
        return emailCliente;
    }

    /**
     * @param emailCliente the emailCliente to set
     */
    public void setEmailCliente(String emailCliente) {
        this.emailCliente = emailCliente;
    }

    /**
     * @return the nibCliente
     */
    public String getNibCliente() {
        return nibCliente;
    }

    /**
     * @param nibCliente the nibCliente to set
     */
    public void setNibCliente(String nibCliente) {
        this.nibCliente = nibCliente;
    }

    /**
     * @return the adminsFacade
     */
    public AdminsFacadeLocal getAdminsFacade() {
        return adminsFacade;
    }

    /**
     * @return the bancosLocal
     */
    public BancosRegistadosFacadeLocal getBancosLocal() {
        return bancosLocal;
    }

    /**
     * @return the nibDestino
     */
    public String getNibDestino() {
        return nibDestino;
    }

    /**
     * @param nibDestino the nibDestino to set
     */
    public void setNibDestino(String nibDestino) {
        this.nibDestino = nibDestino;
    }

    /**
     * @return the montante
     */
    public String getMontante() {
        return montante;
    }

    /**
     * @param montante the montante to set
     */
    public void setMontante(String montante) {
        this.montante = montante;
    }

    /**
     * @return the mensagemTransferencia
     */
    public String getMensagemTransferencia() {
        return mensagemTransferencia;
    }

    /**
     * @param mensagemTransferencia the mensagemTransferencia to set
     */
    public void setMensagemTransferencia(String mensagemTransferencia) {
        this.mensagemTransferencia = mensagemTransferencia;
    }

    /**
     * @return the mensagemagamentoServiço
     */
    public String getMensagemPagamentoServiço() {
        return mensagemPagamentoServiço;
    }

    /**
     * @param mensagemagamentoServiço the mensagemagamentoServiço to set
     */
    public void setMensagemPagamentoServiço(String mensagemagamentoServiço) {
        this.mensagemPagamentoServiço = mensagemagamentoServiço;
    }

    /**
     * @return the mensagemSaldos
     */
    public String getMensagemSaldos() {
        return mensagemSaldos;
    }

    /**
     * @param mensagemSaldos the mensagemSaldos to set
     */
    public void setMensagemSaldos(String mensagemSaldos) {
        this.mensagemSaldos = mensagemSaldos;
    }

    /**
     * @return the IPin
     */
    public String getIPin() {
        return IPin;
    }

    /**
     * @param IPin the IPin to set
     */
    public void setIPin(String IPin) {
        this.IPin = IPin;
    }

    /**
     * @return the pin
     */
    public Integer getPin() {
        return pin;
    }

    /**
     * @param pin the pin to set
     */
    public void setPin(Integer pin) {
        this.pin = pin;
    }

    /**
     * @return the codCartaoCliente
     */
    public Integer getCodCartaoCliente() {
        return codCartaoCliente;
    }

    /**
     * @param codCartaoCliente the codCartaoCliente to set
     */
    public void setCodCartaoCliente(Integer codCartaoCliente) {
        this.codCartaoCliente = codCartaoCliente;
    }

    void getSaldosCliente() {
        this.mensagemSaldos = this.mb.getSaldo(codCartaoCliente);
    }

    /**
     * @return the mensagemMovimentosConta
     */
    public String getMensagemMovimentosConta() {
        return mensagemMovimentosConta;
    }

    /**
     * @param mensagemMovimentosConta the mensagemMovimentosConta to set
     */
    public void setMensagemMovimentosConta(String mensagemMovimentosConta) {
        this.mensagemMovimentosConta = mensagemMovimentosConta;
    }

    /**
     * @return the entidade
     */
    public String getEntidade() {
        return entidade;
    }

    /**
     * @param entidade the entidade to set
     */
    public void setEntidade(String entidade) {
        this.entidade = entidade;
    }

    /**
     * @return the referencia
     */
    public String getReferencia() {
        return referencia;
    }

    /**
     * @param referencia the referencia to set
     */
    public void setReferencia(String referencia) {
        this.referencia = referencia;
    }
    // </editor-fold>
}
